/*********************************************************************************************************************
* CH32V307VCT6 Opensourec Library 即（CH32V307VCT6 开源库）是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是CH32V307VCT6 开源库的一部分
*
* CH32V307VCT6 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL（GNU General Public License，即 GNU通用公共许可证）的条款
* 即 GPL 的第3版（即 GPL3.0）或（您选择的）任何后来的版本，重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用，但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有，请参阅<https://www.gnu.org/licenses/>
*
* 额外注明：
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明（即本声明）
*
* 文件名称          zf_common_headfile
* 公司名称          成都逐飞科技有限公司
* 版本信息          查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境          MounRiver Studio V1.8.1
* 适用平台          CH32V307VCT6
* 店铺链接          https://seekfree.taobao.com/
*
* 修改记录
* 日期                                      作者                             备注
* 2022-09-15        大W            first version
********************************************************************************************************************/

#ifndef __HEADFILE_H
#define __HEADFILE_H




#include "stdio.h"
#include "stdint.h"
#include "string.h"
#include "math.h"


//===================================================芯片 SDK 底层===================================================
#include "ch32v30x_adc.h"
#include "ch32v30x_bkp.h"
#include "ch32v30x_can.h"
#include "ch32v30x_crc.h"
#include "ch32v30x_dac.h"
#include "ch32v30x_dbgmcu.h"
#include "ch32v30x_dma.h"
#include "ch32v30x_exti.h"
#include "ch32v30x_flash.h"
#include "ch32v30x_fsmc.h"
#include "ch32v30x_gpio.h"
#include "ch32v30x_i2c.h"
#include "ch32v30x_iwdg.h"
#include "ch32v30x_pwr.h"
#include "ch32v30x_rcc.h"
#include "ch32v30x_rtc.h"
#include "ch32v30x_sdio.h"
#include "ch32v30x_spi.h"
#include "ch32v30x_tim.h"
#include "ch32v30x_usart.h"
#include "ch32v30x_wwdg.h"


//===================================================芯片 SDK 底层===================================================

//====================================================开源库公共层====================================================
#include "zf_common_clock.h"
#include "zf_common_debug.h"
#include "zf_common_font.h"
#include "zf_common_function.h"
#include "zf_common_interrupt.h"
#include "zf_common_fifo.h"
#include "zf_common_typedef.h"
//====================================================开源库公共层====================================================

//===================================================芯片外设驱动层===================================================
#include "zf_driver_adc.h"
#include "zf_driver_delay.h"
#include "zf_driver_dvp.h"
#include "zf_driver_encoder.h"
#include "zf_driver_exti.h"
#include "zf_driver_flash.h"
#include "zf_driver_gpio.h"
//#include "zf_driver_iic.h"
#include "zf_driver_pit.h"
#include "zf_driver_pwm.h"
//#include "zf_driver_soft_iic.h"
//#include "zf_driver_soft_spi.h"
#include "zf_driver_spi.h"
#include "zf_driver_timer.h"
#include "zf_driver_uart.h"
#include "zf_driver_usb_cdc.h"
#include "zf_driver_usb_cdc.h"

//===================================================芯片外设驱动层===================================================

//===================================================外接设备驱动层===================================================
#include "zf_device_camera.h"
#include "zf_device_icm20602.h"
#include "zf_device_ips114.h"
#include "zf_device_tft180.h"
#include "zf_device_ips200.h"
#include "zf_device_mt9v03x_dvp.h"
#include "zf_device_mpu6050.h"
#include "zf_device_type.h"
#include "zf_device_wireless_uart.h"
#include "zf_device_oled.h"
#include "zf_device_scc8660_dvp.h"
#include "zf_device_bluetooth_ch9141.h"
#include "zf_device_wireless_ch573.h"
#include "zf_device_wireless_uart.h"
#include "zf_device_virtual_oscilloscope.h"
#include "zf_device_w25q32.h"
#include "zf_device_k24c02.h"
#include "zf_device_aht20.h"
#include "zf_device_wifi_uart.h"
#include "zf_device_imu660ra.h"
#include "zf_device_imu963ra.h"
#include "zf_device_key.h"
#include "zf_device_gnss.h"
#include "zf_device_dl1a.h"
#include "zf_device_dm1xa.h"
#include "zf_device_wifi_spi.h"
#include "zf_device_dl1b.h"
#include "zf_device_ble6a20.h"

//===================================================外接设备驱动层===================================================


//===================================================应用组件层===================================================
#include "seekfree_assistant.h"
#include "seekfree_assistant_interface.h"
//===================================================应用组件层===================================================

//===================================================用户自定义文件===================================================
#include "init.h"
#include "pid.h"
#include "display.h"
#include "camera.h"
#include "island.h"
//#include "auto_menu.h"
#include "Gyroscope.h"
#include "flash.h"
//===================================================用户自定义文件===================================================
#define LCDH 60
#define LCDW 94

#define ENCODER_QUADDEC         (TIM1_ENCOEDER)                // 正交编码器对应使用的编码器接口 这里使用QTIMER1的ENCOEDER1
#define ENCODER_QUADDEC_A       (TIM1_ENCOEDER_MAP3_CH2_E11)   // A 相对应的引脚
#define ENCODER_QUADDEC_B       (TIM1_ENCOEDER_MAP3_CH1_E9)    // B 相对应的引脚
#define encoder_PIT_CH          (TIM2_PIT)                     // 使用的周期中断编号 如果修改 需要同步对应修改周期中断编号与 isr.c 中的调用
#define encoder_PIT_PRIORITY    (TIM2_IRQn)                    // 对应周期中断的中断编号
#define imu660_PIT_CH           (TIM6_PIT)                     // 使用的周期中断编号 如果修改 需要同步对应修改周期中断编号与 isr.c 中的调用
#define imu660_PIT_PRIORITY     (TIM6_IRQn)                    // 对应周期中断的中断编号
#define PWM_CH1                 (TIM9_PWM_MAP3_CH4_D15)
#define PWM_CH2                 (TIM9_PWM_MAP3_CH3_D13)
#define PWM_CH3                 (TIM9_PWM_MAP3_CH2_D11)
#define PWM_CH4                 (TIM9_PWM_MAP3_CH1_D9)

#define PWM_CH5                 (TIM5_PWM_MAP0_CH1_A0)
#define PWM_CH6                 (TIM5_PWM_MAP0_CH2_A1)
#define PWM_CH7                 (TIM5_PWM_MAP0_CH3_A2)
#define PWM_CH8                 (TIM5_PWM_MAP0_CH4_A3)

extern uint8_t TFT18_User_data[LCDH][LCDW];                    //存放原始图像数据
extern uint8_t TFT18_Bin_data[LCDH][LCDW];                     //存放二值图像数据

extern volatile int16 encoder_data_quaddec;                    // 编码器值

extern int16_t Sideout;
extern int16_t Side_init;

extern int16 duty1;
extern int16 duty2;
extern int16 duty3;
extern int16 duty4;

extern uint8_t open;
extern int8_t menu;

extern uint8_t BLDC_enble_mode;

extern const uint8 Weight[LCDH];                               //权重控制

typedef enum
{
    BLDC_all_enble,
    BLDC_only_down_enble,
    BLDC_only_up_enble
} BLDC_status;

typedef enum
{
    MENU_1,
    MENU_2,
    MENU_3,
    MENU_4,
    MENU_5,
    MENU_6,
    MENU_7,
    MENU_8,
    MENU_9,
    MENU_10,
    MENU_NUM
}ENUM_INDEX;

#define BEEF                    (E8)
#define LED1                    (B1)
#define LED2                    (E10)

#define BLDC_MIN_VOLTAGE        (10500)         // 最低电压值，单位mv
#define ADC_CHANNEL1            (ADC1_IN10_C0)

#define FOOT_THRESHOLD_MAX 8               // 脚点黑边阈值
#define FOOT_THRESHOLD_LINE1_MIN 5         // 脚点白边第一行阈值
#define FOOT_THRESHOLD_LINE2_MIN 8         // 脚点白边第二行阈值
#define FOOT_THRESHOLD_LINE3_MIN 12        // 脚点白边第三行阈值
#define TREA_MAX 30                        // 十字纵向撕裂阈值

#define CONTINUITY_THRESHOLDS 3            // 连续性判断阈值
#define ISLAND_LOST_MIN 10                 // 环岛边最少丢线判断阈值
#define ISLAND_LOST_MAX 50                 // 环岛边最大丢线判断阈值
#define ISLAND_OTHER_LOST_MAX 10           // 环岛另一边边最少丢线判断阈值
#define ISLAND_SEARCH_STOP_MIN LCDH * 0.95 // 环岛最小截止行判断阈值
#define ISLAND_START_Min LCDH - 20         // 环岛最小边界起始点
#define ISLAND_All_LOST_MAX 10             // 环岛最大双边丢线
#define ISLAND_FOOT_THRESHOLD_MIN 20       // 环岛拐点判断阈值

#define DOWN_ERR_SCALE_FACTOR 2          //下无刷误差比例系数

typedef enum
{
    NO_LOST,
    RIGHT_LOST,
    LEFT_LOST,
    ERR,
    RIGHT_UNLOST,
    LEFT_UNLOST,
    ALL_LOST
} Lost_Line_Status; // 丢线状态

typedef enum
{
    STOP,
    START
}Car_Status_Enum; // 车辆状态枚举

extern uint8_t Car_Status; // 车辆状态

typedef struct
{
    uint8_t _11_7v_Flag;
    uint8_t _11_0v_Flag;
    uint16 adc_reg_value;                             // AD转换后的值
    uint16 voltage;                                   // 电池电压值
    uint16 low_power_num;
    uint16 _11_7_num;
    uint16 _11_0_num;
}battery_struct;                                      // 电压结构体

typedef struct
{
    int16_t Left_Baseline_Speed;                      //左电机基准速度
    int16_t Right_Baseline_Speed;                     //右电机基准速度
    int16_t Target_Speed_Out;                         //最终目标速度
    int16_t Straight_Target_Speed;                    //直道一般目标速度
    int16_t Curve_Target_Speed;                       //弯道一般目标速度
    int16_t Curve_Target_Speed_Out;                   //弯道输出速度
    int16_t Down_Target_Speed_Out;                    //下无刷最终目标速度
    int16_t Down_Target_Speed;                        //下无刷一般目标速度
}Target_Speed_Struct;                                 //目标速度结构体

typedef struct
{
    float C_kp,C_kd;                             //转向环pd
    float S_kp,S_kd;                             //转向环pd
    float Sp_kp,Sp_ki;                           //速度环pi
    float Cc_kp,Cc_kd;                           //侧边转向环pd


}Set_Pid_Struct;

typedef struct
{
    volatile uint8_t Left_Len_Col[2];                 // 最长白列,[0]是最长白列的长度,[1】是第某列
    volatile uint8_t Right_Len_Col[2];                // 最长白列,[0]是最长白列的长度,[1】是第某列
    volatile uint8_t White_Column[LCDW];              // 每列白列长度
    volatile uint8_t Search_Stop_Line;                // 搜索截止行
    volatile uint8_t Straight_Flag;                   // 长直道标志位
} Longest_White_Column_Struct;                        // 最长白列结构体

typedef struct
{
    volatile uint8_t All_Num;                         // 双边丢线数
    volatile uint8_t Right_Num;                       // 右丢线数
    volatile uint8_t Left_Num;                        // 左丢线数
    volatile uint8_t Left_Flag[LCDH];                 // 左丢线数组，丢线置1，没丢线置0
    volatile uint8_t Right_Flag[LCDH];                // 右丢线数组，丢线置1，没丢线置0
    volatile uint8_t Start_Left;                      // 左右边界起始点
    volatile uint8_t Start_Right;                     // 第一个非丢线点,常规边界起始点
} Lost_Line_Struct;                                   // 丢线数结构体

typedef struct
{
    volatile uint8_t Left_Line[LCDH];                 // 左边线数组
    volatile uint8_t Right_Line[LCDH];                // 右边线数组
    volatile uint8_t Left_Line_Display[LCDH];         // 左边线补线数组
    volatile uint8_t Right_Line_Display[LCDH];        // 右边线补线数组
    volatile uint8_t Road_Wide[LCDH];                 // 赛宽数组
    int8_t Mid_Line[LCDH];                            // 赛道中线数组

} Line_Edge_Struct;                                   // 边线结构体

typedef struct
{
    volatile uint8 Zebra_Stripes_Flag;                //斑马线标志位
    volatile int change_count;

}Zebra_Stripes_Struct;

typedef struct
{
    volatile uint8_t Cross_Flag;                      // 十字标志位
    volatile uint8_t Left_Down_Find;                  // 拐点标志:左下
    volatile uint8_t Left_Up_Find;                    // 拐点标志:左上
    volatile uint8_t Right_Down_Find;                 // 拐点标志:右上
    volatile uint8_t Right_Up_Find;                   // 拐点标志:右上
} Cross_Struct;                                       // 十字结构体

typedef struct
{
    volatile uint8_t Island_State;                    // 环岛状态标志
    volatile uint8_t Left_Island_Flag;                // 左环岛标志
    volatile uint8_t Right_Island_Flag;               // 右环岛标志
    volatile uint8_t Left_Up_Guai[2];                 // 四个拐点的坐标存储，[0]存y，第某行，{1}存x，第某列
    volatile uint8_t Right_Up_Guai[2];                // 四个拐点的坐标存储，[0]存y，第某行，{1}存x，第某列
    volatile uint8_t Left_Down_Guai[2];               // 四个拐点的坐标存储，[0]存y，第某行，{1}存x，第某列
    volatile uint8_t Right_Down_Guai[2];              // 四个拐点的坐标存储，[0]存y，第某行，{1}存x，第某列
    volatile uint8_t island_state_5_down[2];          // 状态5时即将离开环岛，左右边界边最低点，[0]存y，第某行，{1}存x，第某列
    volatile uint8_t island_state_3_up[2];            // 状态3时即将进入环岛用，左右上面角点[0]存y，第某行，{1}存x，第某列
    volatile float k;                                 // 3和5状态的k
} Island_Struct;                                      // 环岛结构体

typedef struct
{
    volatile uint8_t Barrier_Flag;                    // 障碍物状态标志
    volatile uint8_t Barrier_Left_Flag;               // 左障碍物状态标志
    volatile uint8_t Barrier_Right_Flag;              // 右障碍物状态标志
    volatile uint8_t Left_Find;                       // 拐点标志:左
    volatile uint8_t Right_Find;                      // 拐点标志:右

}Barrier_Detect_Struct;                               // 障碍物结构体

typedef struct
{
    uint8_t monotonicity_change_line[2];              // 单调性改变点坐标，[0]寸某行，[1]寸某列
    uint8_t monotonicity_change_left_flag;            // 不转折是0
    uint8_t monotonicity_change_right_flag;           // 不转折是0
    uint8_t continuity_change_right_flag;             // 连续是0
    uint8_t continuity_change_left_flag;              // 连续是0
} Image_Change_Struct;                                // 单调性改变，连续性数撕裂点结构体

typedef struct
{
    volatile float FJ_Angle;                          // 偏航角
    volatile float FJ_Pitch;                          // 俯仰角
    volatile float FJ_PitchSpeed;
    volatile float FJ_LastPitchSpeed;
    volatile float FJ_LastAngleSpeed;
    volatile float FJ_AngleSpeed;
    volatile float FJ_Angle_Max;
    volatile float FJ_Angle_Min;
    volatile float AngleSpeed;
    int16_t FJ_gyro_z;
    int16_t FJ_gyro_y;
    int16_t ZeroDrift_gyro_y;
    int16_t ZeroDrift_gyro_z;
} Gyroscope_Struct;                                    // 陀螺仪结构体

extern Image_Change_Struct Image_Change;               // 单调性改变，连续性数撕裂点结构体
extern battery_struct battery;                         //电压结构体
extern Lost_Line_Struct Lost;                          // 丢线数结构体
extern Longest_White_Column_Struct LonWCol;            // 最长白列结构体
extern Line_Edge_Struct Line;                          // 边线结构体
extern Cross_Struct Cross;                             // 十字结构体
extern Island_Struct Island;                           // 环岛结构体
extern Gyroscope_Struct Gyroscope;                     // 陀螺仪结构体
extern Barrier_Detect_Struct Barrier;                  // 障碍物结构体
extern Target_Speed_Struct Target_Speed;               //目标速度结构体
extern Zebra_Stripes_Struct Zebra_Stripes;             //斑马线结构体

extern pid_param_t Cascade_Pid;                        //pid转向环
extern pid_param_t Speed_Pid;                          //pid速度环
extern pid_param_t Gyroscope_Pid;                      //pid陀螺仪环
extern Set_Pid_Struct Set_Pid;                         //pid系数结构体

extern pd_param_t Cascade_Pd;                          //pid转向环
extern pd_param_t Speed_Pd;                            //pid转向环
extern pd_param_t Side_Cascade_Pd;                     //侧边转向环

extern pd_param_t My_pd;

extern uint8_t ImageSide[LCDH][2];
extern uint8_t UpdowmSide[2][LCDW];
extern uint8_t imageMidSide[LCDH][1];
extern int16_t SteeringError;

extern int16_t Threshold;                             //阈值
extern volatile float Err;                            // 摄像头误差
extern volatile int16_t speed_val;
extern uint8_t _11_7v_Flag;
extern uint8_t _11_0v_Flag;
extern volatile int16_t Gyroscope_Speed;              //陀螺仪加速度pid输出
extern float sErr;                                    //中线方差

extern volatile int16 encoder_data_quaddec;           // 编码器值
extern volatile uint16_t encoder_accu;

extern uint8_t mode;//拨码开关

extern int16_t timer_1000ms;
extern int16_t count_50ms;

extern uint8_t timer_Zebra;

#endif

